package com.xbongbong.pro.service.toolbox.sms;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.util.DateUtil;
import com.xbongbong.paas.toolbox.util.OkHttpUtil;
import com.xbongbong.pro.sms.model.SmsStatusModel;
import com.xbongbong.saas.domain.entity.SmsStatusEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

/**
 * 用于发送通知类 短信审核
 * @author chb -xbongbong.com
 * @time 2017-6-15 下午5:43:48
 */

@Component
public class SMSNoticeService {

	private static final Logger LOG = LoggerFactory.getLogger(SMSNoticeService.class);
	/**
	 * 应用地址
	 */
	public static final String URI = "http://smssh1.253.com/msg/send/json";
	/**
	 * 账号
	 */
	public static final  String ACCOUNT = "N8010355";
	/**
	 * 密码
	 */
	public static final  String PSWD = "p84jDXw1A";
	/**
	 * 2.5拉取状态报告
	 */
	public static final String GET_STATUS_URI = "http://smssh1.253.com/msg/pull/report";

	/**
	 * 短信前缀
	 */
	public static final String XBB_PREFIX = "【销帮帮】";
	/**
	 * 上海创蓝文化 ，仅用于发送验证码和通知
	 * @param mobiles
	 * @param content
	 * @return
	 */
	public static JSONObject   sendSMS(String mobiles,String content) {
		//encodeURIComponent url编码替换+
		content = content.replaceAll("\\+", "%2B");
		SmsSendRequest smsSingleRequest = new SmsSendRequest(ACCOUNT, PSWD, content, mobiles);
		String requestJson = JSON.toJSONString(smsSingleRequest);
		
		String ret = OkHttpUtil.post( URI, requestJson);
		return JSONObject.parseObject(ret);
	}
	
	
	/**
	 * 上海创蓝文化 ，查询短信发送状态 如果管理员设置用户账号需要主动拉取，
	 * 则用户可以通过上面的URL拉取其发送短信的状态报告。数据拉取成功后服务器会删除当前拉取成功的数据，不再保存！请用户及时存储。此状态报告保存时间为72小时，最大存储10万条
	 * @param  
	 * @param  
	 * @return 响应数据格式：
		{"ret": 0,
		"result": [{
		"msgId":"16110916241729948",
		"reportTime":"1611091624",
		"mobile":"15700000004",
		"status":"DELIVRD",
		"statusDesc":"用户短信接收成功"
		}]}
		ret：请求状态。0成功，其他状态为失败
		result：状态明细结果，没结果则返回空数组
	 */
	public static JSONObject getStatus() {
		Map<String,Object> param = new HashMap<>(16);
		param.put("account", ACCOUNT);
		param.put("password",PSWD);
		param.put("count",100); 
		String ret = OkHttpUtil.post( GET_STATUS_URI, JSON.toJSONString(param));
		return JSONObject.parseObject(ret);
	}
	
	/**
	 * 从创蓝获取短信的发送状态，并入库，循环遍历，直到服务器没有数据，不区分公司
	 * @param smsStatusModel
	 * @return
	 * @author chb
	 * @time 2017-6-16 下午8:32:45
	 */
	public static int saveStatus(SmsStatusModel smsStatusModel ) {
		/**
		 * 保存了多少条状态
		 */
		int retInd = 0 ;
		JSONObject ret =null;
		Integer retCode =0;
		while (true){
			/**
			 * 获取数据
			 */
			ret =getStatus();
			
			if(ret == null){
				break;
			}
			retCode = ret.getInteger("ret");
			if(retCode ==null || retCode !=0){
				break;
			}
			JSONArray retArray = ret.getJSONArray("result");
			if(retArray == null ||  retArray.isEmpty()){
				break;
			}
			
			JSONObject retOne;
			String msgId,status,statusDesc;
			
			for(int i=0;i<retArray.size();i++){
				retOne = retArray.getJSONObject(i);
				
				msgId = retOne.getString("msgId");
				status = retOne.getString("status");
				statusDesc = retOne.getString("statusDesc");
				
				SmsStatusEntity smsStatusEntity = smsStatusModel.getByMsgId(msgId);
				
				smsStatusEntity.setStatusCode(status);
				smsStatusEntity.setStatusMemo(statusDesc);
				smsStatusEntity.setUpdateTime((long)DateUtil.getInt());
				try {
					smsStatusModel.update(smsStatusEntity);
				} catch (XbbException e) {
					LOG.error("更新短信状态失败", e);
				}

			}
			
			
		}
		
		return 0;
	}
	
	
	
	public static JSONObject sendCode(String mobiles,String code) {
		String content = XBB_PREFIX+"亲爱的用户您好，您的验证码为"+code+"，请于10分钟内完成验证。";
		return sendSMS(mobiles, content);
	}

	public static JSONObject sendInvitation(String mobiles,String userName,String receiver ,String companyName){
		String url = "http://t.cn/RakNxKp";
		String content = XBB_PREFIX+receiver+"您好，"+userName+"邀请您加入"+companyName+"，请您尽快安装销帮帮:" + url;
		return sendSMS(mobiles, content);
	}




	// TODO 暂时移除 OApiException错误信息
	public static void main(String argc[]) throws UnsupportedEncodingException{
		String a = "【中彩科技】欢度国庆，举国同庆!在这美好日子里，SHOP++祝您万事大吉，心想事成！国庆期间给您带来不便敬请谅解，我们将一如既往的为您提供最优质的产品和服务，服务热线：4007769999。";
		a = a.replaceAll("\\+", "%2B");
		System.out.println(a);
//		sendSMS("13738007154", a);
		
		try {
			a="【中化研究所】您好，临近清明节，中化所按照国家法定节假日放假3天，您的样品实验会在节后上班继续进行，由于放假给您实验周期带来的延误，敬请谅解！放假期间，我们会安排值班人员，您有任何问题可直接拨打电话：400-601-8236，祝您假期愉快。";
			// sendCode("13738170345", "123456");
			JSONObject retJson = sendSMS("13738170345",a);
			System.out.println(retJson);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("错误");
		}
		
		//String content = "亲爱的用户您好，您的验证码为123456，请于5分钟内完成验证。";
//		SMSService.chanZorSMS("18667015086,18368188674",content);
		//sendSMS("13738170345", content);
		
		
		// 普通短信地址
			 
				// 短信内容{s}
		//					       【中国房协】您好，根据中国房协杂志工作安排，7月组织日本休闲农业在地探索之旅第二季+特色小镇开发运营研讨会第三季•深圳站，诚邀您参加，咨询{s}谢谢。回复TD退订
 			    String msg = "【中国房协】您好，根据中国房协杂志工作安排，7月组织日本休闲农业在地探索之旅第二季+特色小镇开发运营研讨会第三季•深圳站，诚邀您参加，咨询010-62142688、13020042293谢谢。回复TD退订";
//				//手机号码
 				String phone = "13738170345";
//				
//				SmsSendRequest smsSingleRequest = new SmsSendRequest(account, pswd, msg, phone);
//				
//				String requestJson = JSON.toJSONString(smsSingleRequest);
//				
//				String ret;
//			 
//				ret = HttpUtil.post( uri, requestJson,"json");
//				 
//
//				
//				SmsSendResponse smsSingleResponse = JSONObject.parseObject(ret , SmsSendResponse.class);
//
				
				
	}
}


/**
 * 
 * @author tianyh 
 * @date 2017年4月15日 下午3:41:44
 * @Title: SmsSingleRequest
 * @ClassName: SmsSingleRequest
 * @Description:普通短信发送
 */
  class SmsSendRequest {
	/**
	 * 用户账号，必填
	 */
	private String account;
	/**
	 * 用户密码，必填
	 */
	private String password;
	/**
	 * 短信内容。长度不能超过536个字符，必填
	 */
	private String msg;
	/**
	 * 机号码。多个手机号码使用英文逗号分隔，必填
	 */
	private String phone;
	
	
	/**
	 * 定时发送短信时间。格式为yyyyMMddHHmm，值小于或等于当前时间则立即发送，默认立即发送，选填
	 */
	private String sendtime;
	/**
	 * 是否需要状态报告（默认false），选填
	 */
	private Boolean report;
	/**
	 * 下发短信号码扩展码，纯数字，建议1-3位，选填
	 */
	private String extend;
	/**
	 * 该条短信在您业务系统内的ID，如订单号或者短信发送记录流水号，选填
	 */
	private String uid;
	
	public SmsSendRequest() {
		
	}
	public SmsSendRequest(String account, String password, String msg, String phone) {
		super();
		this.account = account;
		this.password = password;
		this.msg = msg;
		this.phone = phone;
		this.report = true;
	}
	public SmsSendRequest(String account, String password, String msg, String phone, String sendtime) {
		super();
		this.account = account;
		this.password = password;
		this.msg = msg;
		this.phone = phone;
		this.sendtime=sendtime;
	}
	public String getAccount() {
		return account;
	}
	public void setAccount(String account) {
		this.account = account;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getSendtime() {
		return sendtime;
	}
	public void setSendtime(String sendtime) {
		this.sendtime = sendtime;
	}
	public Boolean getReport() {
		return report;
	}
	public void setReport(Boolean report) {
		this.report = report;
	}
	public String getExtend() {
		return extend;
	}
	public void setExtend(String extend) {
		this.extend = extend;
	}
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	
	
}

  
  
  
		
		
		
 
